package com.example.redislearning.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 学习进度服务接口
 * 定义学习进度相关的业务逻辑
 */
public interface LearningProgressService {

    /**
     * 开始学习课程
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 是否成功开始
     */
    boolean startLearning(Integer userId, Integer courseId);

    /**
     * 更新学习进度
     * @param userId 用户ID
     * @param courseId 课程ID
     * @param progress 进度百分比 (0-100)
     * @return 是否更新成功
     */
    boolean updateProgress(Integer userId, Integer courseId, Double progress);

    /**
     * 记录学习时长
     * @param userId 用户ID
     * @param courseId 课程ID
     * @param minutes 学习时长（分钟）
     * @return 是否记录成功
     */
    boolean recordStudyTime(Integer userId, Integer courseId, Integer minutes);

    /**
     * 获取学习进度
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 进度百分比
     */
    Double getLearningProgress(Integer userId, Integer courseId);

    /**
     * 获取学习时长
     * @param userId 用户ID
     * @param courseId 课程ID（可为null，获取总时长）
     * @return 学习时长（分钟）
     */
    Integer getStudyTime(Integer userId, Integer courseId);

    /**
     * 获取学习进度列表
     * @param userId 用户ID
     * @return 学习进度列表
     */
    List<Map<String, Object>> getLearningProgressList(Integer userId);

    /**
     * 获取学习时长排行榜
     * @param limit 限制数量
     * @return 排行榜列表
     */
    List<Map<String, Object>> getStudyTimeRanking(int limit);

    /**
     * 标记课程完成
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 是否标记成功
     */
    boolean markCourseCompleted(Integer userId, Integer courseId);

    /**
     * 获取已完成课程
     * @param userId 用户ID
     * @return 已完成课程ID集合
     */
    Set<Integer> getCompletedCourses(Integer userId);

    /**
     * 获取学习统计信息
     * @param userId 用户ID
     * @return 学习统计信息
     */
    Map<String, Object> getLearningStats(Integer userId);

    /**
     * 保存进度到数据库
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 是否保存成功
     */
    boolean saveProgressToDatabase(Integer userId, Integer courseId);
}